package controller

import (
	"context"
	"mldong/api/base"
	menuApi "mldong/api/menu"
	"mldong/internal/modules/sys/logic"
	"mldong/internal/modules/sys/service"
	"mldong/utility"

	"github.com/gogf/gf/v2/frame/g"
)

func init() {
	// 注册控制器时自动注入依赖
	utility.RegisterController(&MenuController{
		// menuService: utility.MustResolve(service.MenuServiceType).(service.IMenuService),
		// 控制层使用强依赖logic的方式，保证逻辑层的init方法比controller的方法先执行
		menuService: utility.MustResolve(service.MenuServiceType).(*logic.MenuLogic),
	})
}

type MenuController struct {
	menuService service.IMenuService
}

// 保存菜单
func (ctrl *MenuController) Save(ctx context.Context, req *menuApi.SaveReq) (res *base.CommonResult, err error) {
	success, err := ctrl.menuService.Save(ctx, req)
	if err != nil {
		return
	}
	if success {
		jsonData := base.Ok()
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	} else {
		jsonData := base.FailWithDefaultCode("保存菜单失败")
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	}
	return
}

// 修改菜单
func (ctrl *MenuController) Update(ctx context.Context, req *menuApi.UpdateReq) (res *base.CommonResult, err error) {
	success, err := ctrl.menuService.Update(ctx, req)
	if err != nil {
		return
	}
	if success {
		jsonData := base.Ok()
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	} else {
		jsonData := base.FailWithDefaultCode("修改菜单失败")
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	}
	return
}

// 删除菜单
func (ctrl *MenuController) Remove(ctx context.Context, req *menuApi.RemoveReq) (res *base.CommonResult, err error) {
	success, err := ctrl.menuService.Remove(ctx, req.Ids)
	if err != nil {
		return
	}
	if success {
		jsonData := base.Ok()
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	} else {
		jsonData := base.FailWithDefaultCode("删除菜单失败")
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	}
	return
}

// 获取菜单详情
func (ctrl *MenuController) Detail(ctx context.Context, req *menuApi.DetailReq) (res *menuApi.DetailRes, err error) {
	// 设置 JSON 数据
	jsonData, err := ctrl.menuService.Detail(ctx, req.ID)
	if err != nil {
		return
	}
	g.RequestFromCtx(ctx).Response.WriteJson(base.Data(jsonData))
	return
}

// 分页查询菜单列表
func (ctrl *MenuController) Page(ctx context.Context, req *menuApi.PageReq) (res *menuApi.PageRes, err error) {
	// 传递以m_开头的查询参数
	req.QueryParamMap = utility.GetQueryParamMap(ctx)
	jsonData, err := ctrl.menuService.Page(ctx, req)
	if err != nil {
		return
	}
	g.RequestFromCtx(ctx).Response.WriteJson(base.Data(jsonData))
	return
}

// 查询菜单列表
func (ctrl *MenuController) List(ctx context.Context, req *menuApi.ListReq) (res *menuApi.ListRes, err error) {
	// 传递以m_开头的查询参数
	req.QueryParamMap = utility.GetQueryParamMap(ctx)
	jsonData, err := ctrl.menuService.List(ctx, req)
	if err != nil {
		return
	}
	g.RequestFromCtx(ctx).Response.WriteJson(base.Data(jsonData))
	return
}

// 查询菜单树
func (ctrl *MenuController) Tree(ctx context.Context, req *menuApi.TreeReq) (res *menuApi.TreeRes, err error) {
	// 传递以m_开头的查询参数
	req.QueryParamMap = utility.GetQueryParamMap(ctx)
	jsonData, err := ctrl.menuService.Tree(ctx, req)
	if err != nil {
		return
	}
	g.RequestFromCtx(ctx).Response.WriteJson(base.Data(jsonData))
	return
}

// 应用列表
func (ctrl *MenuController) AppList(ctx context.Context, req *menuApi.AppListReq) (res *menuApi.AppListRes, err error) {
	jsonData, err := ctrl.menuService.AppList(ctx)
	if err != nil {
		return
	}
	g.RequestFromCtx(ctx).Response.WriteJson(base.Data(jsonData))
	return
}

func (ctrl *MenuController) SyncRoute(ctx context.Context, req *menuApi.SyncRouteReq) (res *base.CommonResult, err error) {
	// 手动绑定请求体到Routes字段
	var routes []*menuApi.SyncRouteParam
	if err = g.RequestFromCtx(ctx).Parse(&routes); err != nil {
		return nil, err
	}

	_, err = ctrl.menuService.SyncRoute(ctx, routes)
	if err != nil {
		return nil, err
	}
	g.RequestFromCtx(ctx).Response.WriteJson(base.Ok())

	return
}
func (ctrl *MenuController) Vben5Req(ctx context.Context, req *menuApi.Vben5Req) (res *menuApi.RouteMenuRes, err error) {
	// 从请求上下文中获取userId
	userId := utility.GetCurrentUserId(ctx)
	jsonData, err := ctrl.menuService.UserRouteMenu(ctx, userId, "v5")
	if err != nil {
		return nil, err
	}
	g.RequestFromCtx(ctx).Response.WriteJson(base.Data(jsonData))

	return
}
func (ctrl *MenuController) Vben2Req(ctx context.Context, req *menuApi.Vben2Req) (res *menuApi.RouteMenuRes, err error) {
	// 从请求上下文中获取userId
	userId := utility.GetCurrentUserId(ctx)
	jsonData, err := ctrl.menuService.UserRouteMenu(ctx, userId, "v2")
	if err != nil {
		return nil, err
	}
	g.RequestFromCtx(ctx).Response.WriteJson(base.Data(jsonData))

	return
}
func (ctrl *MenuController) ArtDesignPro(ctx context.Context, req *menuApi.ArtDesignPro) (res *menuApi.RouteMenuRes, err error) {
	// 从请求上下文中获取userId
	userId := utility.GetCurrentUserId(ctx)
	jsonData, err := ctrl.menuService.UserRouteMenu(ctx, userId, "art-design-pro")
	if err != nil {
		return nil, err
	}
	g.RequestFromCtx(ctx).Response.WriteJson(base.Data(jsonData))

	return
}
